﻿using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Collections.Generic;
using System.Text;
using System.Data.OleDb;
using System.Collections;

/// <summary>
/// Summary description for ConnectUnit
/// </summary>
public class ConnectUnit
{
    private ConnectBD connect;
    public ConnectUnit(String Host, String Username, String Password, String Database)
    {
        this.connect = new ConnectBD(Host, Username, Password, Database);
    }
    //Biến kết nối cơ bản
    public OleDbDataAdapter getAdapter()
    {
        OleDbCommandBuilder builder = new OleDbCommandBuilder(connect.da);
        connect.da.UpdateCommand = builder.GetUpdateCommand();
        return connect.da;
    }
    //Hàm select nguyên mẫu
    public DataSet Select(String TableName, String Condition, String OrderBy)
    {
        //Khai báo đối tượng query builder để tạo câu lệnh truy vấn
        StringBuilder query = new StringBuilder("SELECT * FROM " + TableName);
        //Bổ xung điều kiện truy vấn cho query
        this.AddCondition(query, Condition);
        //Điều kiện sắp xếp
        this.AddOrderBy(query, OrderBy);
        //Thêm dấu ; để kết thúc câu lệnh truy vấn
        query.Append(";");

        //Thực hiện truy vấn trả dữ liệu về ném vào dataset
        return this.connect.executeQuery(query.ToString());
    }
    //Câu lệnh truy vấn không cần sắp xếp
    public DataSet Select(String TableName, String Condition)
    {
        return this.Select(TableName, Condition, null);
    }

    //Câu lệnh truy vấn lấy tất cả dữ liệu trong bảng
    public DataSet Select(String TableName)
    {
        return this.Select(TableName, null);
    }
    //Hàm ghép điều kiện
    private void AddCondition(StringBuilder query, String Condition)
    {
        if (Condition != null) query.Append(" WHERE " + Condition);
    }

    //Hàm sắp xếp
    private void AddOrderBy(StringBuilder query, String OrderBy)
    {
        if (OrderBy != null) query.Append(" Order By " + OrderBy);
    }

    //Câu lệnh chèn dữ liệu Insert
    public Boolean Insert(String TableName, Dictionary<String, Object> ColumnValues)
    {
        //query dùng để tạo câu lệnh insert đầy đủ
        StringBuilder query = new StringBuilder("INSERT INTO " + TableName);
        // valueInsert là chuỗi các giá trị chèn vào câu lệnh insert
        StringBuilder valueInsert = new StringBuilder();
        query.Append("(");
        //vòng lặp ghép các giá trị vào các trường
        foreach (String key in ColumnValues.Keys)
        {
            query.Append(key + ",");
            valueInsert.Append("N'" + ColumnValues[key].ToString() + "' ,");
        }
        //Cắt bỏ dấu phẩy thừa ở cuối mỗi chuỗi
        query = query.Remove(query.Length - 1, 1);
        valueInsert = valueInsert.Remove(valueInsert.Length - 1, 1);
        //Kết thúc các chuỗi
        query.Append(") Values(" + valueInsert.ToString() + ")");
        query.Append(";");
        //Thực hiện chèn dữ liệu, nếu thực hiện được giá trị trả về của hàm insert là true và ngược lại
        return this.connect.executeUpdate(query.ToString())>0;
        
    }

    public Boolean Update(String TableName, Dictionary<String, Object> ColumnValues, String Condition)
    {
        StringBuilder query = new StringBuilder("Update " + TableName + " Set ");

        foreach (String key in ColumnValues.Keys)
        {
            query.Append(key + "= N'" + ColumnValues[key].ToString() + "' ,");
        }
        query = query.Remove(query.Length - 1, 1);
        this.AddCondition(query, Condition);
        query.Append(";");
        return this.connect.executeUpdate(query.ToString()) > 0;
    }

    public Boolean Delete(String TableName, String Condition)
    {
        StringBuilder query = new StringBuilder("DELETE FROM " + TableName);
        this.AddCondition(query, Condition);
        query.Append(";");
        return this.connect.executeUpdate(query.ToString()) > 0;
    }

    public int getRowCount(DataSet DS)
    {
        try
        {
            return DS.Tables["data"].Rows.Count;
        }
        catch
        {
            return 0;
        }

    }

    public String[] getColumnName(DataSet DS)
    {
        int ColumnCount = DS.Tables[0].Columns.Count;

        String[] list = new String[ColumnCount];
        for (int i = 0; i < ColumnCount; i++)
        {
            list[i] = DS.Tables[0].Columns[0].ColumnName;
        }
        return list;
    }
}

